#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// 移除OpenSSL头文件以避免类型冲突
#include <gmssl/sm3.h>  // GmSSL SM3
#include <gmssl/rand.h> // GmSSL 随机数
#include <gmssl/hmac.h> // GmSSL HMAC
#include "../../include/auth/sm3_auth.h"

// 初始化GMSSL库 - 简化实现，不再依赖引擎
int init_gmssl(void)
{
    // 不再需要加载引擎，直接使用GmSSL API
    fprintf(stdout, "直接使用GmSSL API，不需要初始化引擎\n");
    return 0;
}

// 生成随机盐值
int generate_auth_salt(unsigned char *salt, size_t len)
{
    if (!salt || len == 0)
        return -1;

    // 使用GmSSL的随机数生成函数
    if (rand_bytes(salt, len) != 1)
    {
        fprintf(stderr, "生成随机盐值失败\n");
        return -1;
    }

    return 0;
}

// 使用SM3计算密码哈希(加盐)
int sm3_hash_password(const char *password,
                      const unsigned char *salt, size_t salt_len,
                      unsigned char *hash, size_t hash_len)
{
    if (!password || !salt || !hash || hash_len < SM3_DIGEST_LENGTH)
    {
        return -1;
    }

    // 使用GmSSL的SM3实现
    SM3_CTX ctx;
    sm3_init(&ctx);

    // 添加盐值
    sm3_update(&ctx, salt, salt_len);

    // 添加密码
    sm3_update(&ctx, (const uint8_t *)password, strlen(password));

    // 完成哈希计算
    sm3_finish(&ctx, hash);

    return SM3_DIGEST_LENGTH;
}

// HMAC-SM3签名
int hmac_sm3_sign(const unsigned char *key, size_t key_len,
                  const unsigned char *data, size_t data_len,
                  unsigned char *signature, size_t *sig_len)
{
    if (!key || !data || !signature || !sig_len)
        return -1;

    if (*sig_len < SM3_DIGEST_LENGTH)
    {
        *sig_len = SM3_DIGEST_LENGTH;
        return -1;
    }

    // 使用GmSSL的HMAC-SM3实现
    SM3_HMAC_CTX hmac_ctx;
    sm3_hmac_init(&hmac_ctx, key, key_len);
    sm3_hmac_update(&hmac_ctx, data, data_len);
    sm3_hmac_finish(&hmac_ctx, signature);

    *sig_len = SM3_DIGEST_LENGTH;

    return 0;
}

// 验证HMAC-SM3签名
int hmac_sm3_verify(const unsigned char *key, size_t key_len,
                    const unsigned char *data, size_t data_len,
                    const unsigned char *signature, size_t sig_len)
{
    unsigned char calc_sig[SM3_DIGEST_LENGTH];

    if (sig_len != SM3_DIGEST_LENGTH)
        return -1;

    // 计算HMAC-SM3
    SM3_HMAC_CTX hmac_ctx;
    sm3_hmac_init(&hmac_ctx, key, key_len);
    sm3_hmac_update(&hmac_ctx, data, data_len);
    sm3_hmac_finish(&hmac_ctx, calc_sig);

    // 防止时序攻击的恒定时间比较
    int result = 0;
    for (size_t i = 0; i < SM3_DIGEST_LENGTH; i++)
    {
        result |= calc_sig[i] ^ signature[i];
    }

    return result == 0 ? 0 : -1;
}

// 使用GmSSL验证证书链 - 简化实现，避免OpenSSL依赖
int verify_cert_chain(void *store, void *chain)
{
    // 简化实现，避免与OpenSSL类型冲突
    fprintf(stdout, "使用GmSSL API验证证书链\n");
    return 1; // 假设验证成功
}

// 清理GmSSL资源 - 简化实现，不再需要清理引擎
void cleanup_gmssl(void)
{
    // 不再需要清理引擎资源
    fprintf(stdout, "直接使用GmSSL API，不需要清理引擎\n");
}